home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / boot / czesc_2 / toolmanager / source / prefs / listreq.c < prev    next >
C/C++ Source or Header  |  1993-05-15  |  7KB  |  240 lines

  1. /*
  2.  * listreq.c  V2.1
  3.  *
  4.  * list requester handling
  5.  *
  6.  * (c) 1990-1993 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Window data */
  12. static struct Gadget *gl;             /* Gadget list */
  13. static struct Window *w;              /* Window */
  14. static struct MsgPort *wp;            /* Window user port */
  15. static UWORD ww,wh;                   /* Window size */
  16. static struct List *CurrentList;
  17. static struct Node *CurrentNode;
  18. static ULONG OldSeconds,OldMicros;
  19.  
  20. /* Gadget data */
  21. #define GAD_LIST   0
  22. #define GAD_OK     1
  23. #define GAD_CANCEL 2
  24. #define GADGETS    3
  25. static struct GadgetData gdata[GADGETS];
  26.  
  27. /* Gadget tags */
  28. static struct TagItem lvtags[]={GTLV_Labels,       NULL,
  29.                                 GTLV_ShowSelected, NULL,
  30.                                 TAG_DONE};
  31.  
  32. /* Gadget vanilla key data */
  33. #define KEY_OK     0
  34. #define KEY_CANCEL 1
  35. static char KeyArray[KEY_CANCEL+1];
  36.  
  37. /* Init list requester */
  38. void InitListRequester(UWORD left, UWORD fheight)
  39. {
  40.  ULONG tmp,maxw1,maxw2;
  41.  struct GadgetData *gd;
  42.  
  43.  /* Init strings */
  44.  gdata[GAD_OK].name    =AppStrings[MSG_WINDOW_OK_GAD];
  45.  gdata[GAD_CANCEL].name=AppStrings[MSG_WINDOW_CANCEL_GAD];
  46.  
  47.  /* Calculate maximum width for list gadget */
  48.  maxw1=ListViewColumns*ScreenFont->tf_XSize;
  49.  ww=maxw1+INTERWIDTH;
  50.  
  51.  /* Calculate maximum width for button gadgets */
  52.  gd=&gdata[GAD_OK];
  53.  maxw2=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
  54.  gd++;
  55.  if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
  56.   maxw2=tmp;
  57.  maxw2+=2*INTERWIDTH;
  58.  if ((tmp=2*(maxw2+INTERWIDTH)) > ww) ww=tmp;
  59.  
  60.  /* window height */
  61.  wh=(ListViewRows+3)*fheight+3*INTERHEIGHT;
  62.  
  63.  /* ListView gadget */
  64.  gd=gdata;
  65.  tmp=ww-INTERWIDTH;
  66.  gd->type=LISTVIEW_KIND;
  67.  gd->tags=lvtags;
  68.  gd->left=left;
  69.  gd->top=WindowTop+INTERHEIGHT;
  70.  gd->width=tmp;
  71.  gd->height=(ListViewRows+2)*fheight;
  72.  
  73.  /* OK gadget */
  74.  tmp=WindowTop+(ListViewRows+2)*fheight+2*INTERHEIGHT;
  75.  gd++;
  76.  gd->type=BUTTON_KIND;
  77.  gd->flags=PLACETEXT_IN;
  78.  gd->tags=NULL;
  79.  gd->left=left;
  80.  gd->top=tmp;
  81.  gd->width=maxw2;
  82.  gd->height=fheight;
  83.  
  84.  /* Cancel Gadget */
  85.  gd++;
  86.  gd->type=BUTTON_KIND;
  87.  gd->flags=PLACETEXT_IN;
  88.  gd->tags=NULL;
  89.  gd->left=ww-maxw2-INTERWIDTH+left;
  90.  gd->top=tmp;
  91.  gd->width=maxw2;
  92.  gd->height=fheight;
  93.  
  94.  /* Init vanilla key array */
  95.  KeyArray[KEY_OK]    =FindVanillaKey(gdata[GAD_OK].name);
  96.  KeyArray[KEY_CANCEL]=FindVanillaKey(gdata[GAD_CANCEL].name);
  97. }
  98.  
  99. /* Open list requester */
  100. BOOL OpenListRequester(ULONG type, struct Window *oldwindow)
  101. {
  102.  char *title;
  103.  
  104.  /* Set title & list */
  105.  switch (type) {
  106.   case LISTREQ_EXEC:  title=AppStrings[MSG_LISTREQ_TITLE_EXEC];
  107.                       CurrentList=&ObjectLists[TMOBJTYPE_EXEC];
  108.                       break;
  109.   case LISTREQ_IMAGE: title=AppStrings[MSG_LISTREQ_TITLE_IMAGE];
  110.                       CurrentList=&ObjectLists[TMOBJTYPE_IMAGE];
  111.                       break;
  112.   case LISTREQ_SOUND: title=AppStrings[MSG_LISTREQ_TITLE_SOUND];
  113.                       CurrentList=&ObjectLists[TMOBJTYPE_SOUND];
  114.                       break;
  115.   case LISTREQ_DOCK:  title=AppStrings[MSG_LISTREQ_TITLE_DOCK];
  116.                       CurrentList=&ObjectLists[TMOBJTYPE_DOCK];
  117.                       break;
  118.   case LISTREQ_PUBSC: title=AppStrings[MSG_LISTREQ_TITLE_PUBSCREEN];
  119.                       CurrentList=&PubScreenList;
  120.                       break;
  121.  }
  122.  
  123.  /* Set tags */
  124.  lvtags[0].ti_Data=(ULONG) CurrentList;
  125.  
  126.  /* Create gadgets */
  127.  if (gl=CreateGadgetList(gdata,GADGETS)) {
  128.   /* Open window */
  129.   if (w=OpenWindowTags(NULL,WA_Left,        oldwindow->LeftEdge,
  130.                             WA_Top,         oldwindow->TopEdge+WindowTop,
  131.                             WA_InnerWidth,  ww,
  132.                             WA_InnerHeight, wh,
  133.                             WA_AutoAdjust,  TRUE,
  134.                             WA_Title,       title,
  135.                             WA_PubScreen,   PublicScreen,
  136.                             WA_Flags,       WFLG_CLOSEGADGET|WFLG_DRAGBAR|
  137.                                             WFLG_DEPTHGADGET|WFLG_RMBTRAP|
  138.                                             WFLG_ACTIVATE,
  139.                             TAG_DONE)) {
  140.    /* Add gadgets to window */
  141.    AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  142.    RefreshGList(gl,w,NULL,(UWORD) -1);
  143.    GT_RefreshWindow(w,NULL);
  144.  
  145.    /* Set local variables */
  146.    w->UserPort=IDCMPPort;
  147.    w->UserData=(BYTE *) HandleListRequesterIDCMP;
  148.    ModifyIDCMP(w,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|
  149.                  LISTVIEWIDCMP|IDCMP_VANILLAKEY);
  150.    CurrentWindow=w;
  151.    CurrentNode=NULL;
  152.    OldSeconds=0;
  153.    OldMicros=0;
  154.  
  155.    /* All OK. (Return window UserPort signal mask) */
  156.    return(TRUE);
  157.   }
  158.  
  159.   FreeGadgets(gl);
  160.  }
  161.  /* Call failed */
  162.  return(FALSE);
  163. }
  164.  
  165. /* Close list requester */
  166. void CloseListRequester(void)
  167. {
  168.  /* Free resources */
  169.  RemoveGList(w,gl,(UWORD) -1);
  170.  CloseWindowSafely(w);
  171.  FreeGadgets(gl);
  172. }
  173.  
  174. /* Handle list requester IDCMP events */
  175. void *HandleListRequesterIDCMP(struct IntuiMessage *msg)
  176. {
  177.  struct Node *NewNode;
  178.  
  179.  /* Which IDCMP Class? */
  180.  switch (msg->Class) {
  181.   case IDCMP_CLOSEWINDOW:   NewNode=LREQRET_CANCEL;
  182.                             break;
  183.   case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
  184.                             GT_EndRefresh(w,TRUE);
  185.                             break;
  186.   case IDCMP_GADGETUP:
  187.    switch (((struct Gadget *) msg->IAddress)->GadgetID) {
  188.     case GAD_LIST:   {
  189.                       ULONG code=msg->Code;
  190.  
  191.                       /* Search node */
  192.                       CurrentNode=GetHead(CurrentList);
  193.                       while (code--) CurrentNode=GetSucc(CurrentNode);
  194.  
  195.                       /* Double-click? */
  196.                       if (DoubleClick(OldSeconds,OldMicros,
  197.                                       msg->Seconds,msg->Micros))
  198.                        /* Yes. Quit requester */
  199.                        if (CurrentNode)
  200.                         NewNode=CurrentNode;
  201.                        else
  202.                         NewNode=LREQRET_NOSELECT;
  203.  
  204.                       /* Save current time */
  205.                       OldSeconds=msg->Seconds;
  206.                       OldMicros=msg->Micros;
  207.                      }
  208.                      break;
  209.     case GAD_OK:     if (CurrentNode)
  210.                       NewNode=CurrentNode;
  211.                      else
  212.                       NewNode=LREQRET_NOSELECT;
  213.                      break;
  214.     case GAD_CANCEL: NewNode=LREQRET_CANCEL;
  215.                      break;
  216.    }
  217.    break;
  218.   case IDCMP_VANILLAKEY:
  219.    switch (MatchVanillaKey(msg->Code,KeyArray)) {
  220.     case KEY_OK:     if (CurrentNode)
  221.                       NewNode=CurrentNode;
  222.                      else
  223.                       NewNode=LREQRET_NOSELECT;
  224.                      break;
  225.     case KEY_CANCEL: NewNode=LREQRET_CANCEL;
  226.                      break;
  227.    }
  228.    break;
  229.  }
  230.  
  231.  /* Close window? */
  232.  if (NewNode) {
  233.   /* Yes. But first reply message!!! */
  234.   GT_ReplyIMsg(msg);
  235.   CloseListRequester();
  236.  }
  237.  
  238.  return(NewNode);
  239. }
  240.